package br.com.percolacate;

import br.com.percolacate.Site.Status;

public class Percolation {
	private Site[][] sites;
	public int n; 
	public String teste;

	public Percolation(int n){
		sites = new Site[n][n];
		this.n = n;
		for(int i =0; i <n; i++){
			for(int j =0;  j <n; j++){
				sites[i][j] = new Site(Status.BLOCKED); 
				sites[i][j].setJ(j);
				sites[i][j].setN(i);
			}

		}

	}
	public void open(int i,int j){
		sites[i][j].setStatus(Status.OPEN);
	}

	public boolean isOpen(int i,int j){
		return sites[i][j].getStatus().equals(Status.OPEN);
	}

	public boolean isFull(int i,int j){
		return sites[i][j].getStatus().equals(Status.FULL);
	}


	public Site[][] getSites() {
		return sites;
	}

	public void setSites(Site[][] sites) {
		this.sites = sites;
	}

	public boolean isPercolado(Site site,Site anterior){
		if(site.getN()==n-1){
			return true;
		}
		if(site.getJ()-1>=0){
			if(anterior==null || (anterior.getJ()!= site.getJ()-1 && anterior.getN()!= site.getN())){
				if(sites[site.getN()][site.getJ()-1].getStatus().equals(Status.OPEN)){
					return isPercolado(sites[site.getN()][site.getJ()-1], site);
				}
			}
		}
		if(site.getJ()+1<n){
			System.out.print("Percorre Direita");
			if(anterior==null || (anterior.getJ()!= site.getJ()+1 && anterior.getN()!= site.getN())){
				if(sites[site.getN()][site.getJ()+1].getStatus().equals(Status.OPEN)){
					return isPercolado(sites[site.getN()][site.getJ()+1], site);
				}
			}
		}

		if(site.getN()-1>=0){
			System.out.print("Percorre para traz");
			if(anterior==null || (anterior.getN()!= site.getN()-1 && anterior.getJ()!= site.getJ())){
				if(sites[site.getN()-1][site.getJ()].getStatus().equals(Status.OPEN)){
					return isPercolado(sites[site.getN()-1][site.getJ()], site);
				}
			}
		}
		if(site.getN()+1<n){
			System.out.print("Percorre para frente");
			boolean ant =( site.getN()+1 == anterior.getN() && anterior.getJ() == site.getJ());
					
					
			if(anterior==null || !ant){
					if(sites[site.getN()+1][site.getJ()].getStatus().equals(Status.OPEN)){
						return isPercolado(sites[site.getN()+1][site.getJ()], site);
					}
			}
		}

		return false;
	}
	public boolean isPercolato(){
		for(int i =0; i <sites.length; i++){
			if(isPercolado(sites[0][i], null)){
				return true;
			}
		}
		return false;
	}

}
